package hello;

/**
 * Created with IntelliJIDEA.
 * Description:
 * User: ASUS
 * Date: 2025/9/3
 * Time: 17:35
 */
// 定义一个名为 MethodOuter 的外部类
public class MethodOuter {
    // 定义一个外部类的私有实例变量，值为 "外部类的字段"
    private String outerField = "外部类的字段";

    // 定义一个方法，该方法内部将包含一个局部内部类
    public void processData() {
        // 这是方法内的局部变量。
        // 在 Java 8 之前，这里必须显式写 final。
        // 从 Java 8 开始，如果一个变量在初始化后没有被再次赋值，它就是“事实上的final”(effectively final)，可以被局部内部类访问。
        String localVariable = "方法内的局部变量";
        // 如果下面这行取消注释，localVariable 就不是 effectively final 了，会导致编译错误
        // localVariable = "试图修改";

        // === 局部内部类的定义 ===
        // LocalInner 类定义在 processData 方法的内部。
        // 它的作用域仅限于这个方法，不能加 public, private, static 等修饰符。
        class LocalInner {
            // 局部内部类的方法
            public void display() {
                // 1. 访问外部类的字段
                // 局部内部类和实例内部类一样，可以访问外部类的所有成员，包括私有成员。
                System.out.println("访问外部类字段: " + outerField);

                // 2. 访问方法内的局部变量
                // 这是局部内部类的特有能力：可以访问其所在方法的局部变量（前提是final或事实上的final）。
                System.out.println("访问方法局部变量: " + localVariable);
            }
        }

        // === 在方法内创建并使用局部内部类 ===
        // LocalInner 类的实例只能在其定义所在的方法（或代码块）内部创建。
        LocalInner localInner = new LocalInner();
        // 调用它的方法来执行其内部逻辑。
        localInner.display();
    }

    // === 测试入口 ===
    // 程序的 main 方法
    public static void main(String[] args) {
        // 创建外部类实例，因为 processData 是一个实例方法。
        MethodOuter outer = new MethodOuter();
        // 调用包含局部内部类的方法，从而触发局部内部类的定义、实例化和使用。
        outer.processData();
    }
}
